# This code is hosted on http://code.google.com/p/lenthorp/
# Freely available for use in applications, but should NOT be modified
# Email all comments to lenthorpresearch@gmail.com


import urllib
from datetime import datetime

##
##
##def __request(symbol, stat):
##    url = 'http://finance.yahoo.com/d/quotes.csv?s=%s&f=%s' % (symbol, stat)
##    return urllib.urlopen(url).read().strip().strip('"')
##
##
##def get_all(symbol):
##    """
##    Get all available quote data for the given ticker symbol.
##    
##    Returns a dictionary.
##    """
##    values = __request(symbol, 'l1c1va2xj1b4j4dyekjm3m4rr5p5p6s7').split(',')
##    data = {}
##    data['price'] = values[0]
##    data['change'] = values[1]
##    data['volume'] = values[2]
##    data['avg_daily_volume'] = values[3]
##    data['stock_exchange'] = values[4]
##    data['market_cap'] = values[5]
##    data['book_value'] = values[6]
##    data['ebitda'] = values[7]
##    data['dividend_per_share'] = values[8]
##    data['dividend_yield'] = values[9]
##    data['earnings_per_share'] = values[10]
##    data['52_week_high'] = values[11]
##    data['52_week_low'] = values[12]
##    data['50day_moving_avg'] = values[13]
##    data['200day_moving_avg'] = values[14]
##    data['price_earnings_ratio'] = values[15]
##    data['price_earnings_growth_ratio'] = values[16]
##    data['price_sales_ratio'] = values[17]
##    data['price_book_ratio'] = values[18]
##    data['short_ratio'] = values[19]
##    return data
##    
##    
##def get_price(symbol): 
##    return __request(symbol, 'l1')
##
##
##def get_change(symbol):
##    return __request(symbol, 'c1')
##    
##    
##def get_volume(symbol): 
##    return __request(symbol, 'v')
##
##
##def get_avg_daily_volume(symbol): 
##    return __request(symbol, 'a2')
##    
##    
##def get_stock_exchange(symbol): 
##    return __request(symbol, 'x')
##    
##    
##def get_market_cap(symbol):
##    return __request(symbol, 'j1')
##   
##   
##def get_book_value(symbol):
##    return __request(symbol, 'b4')
##
##
##def get_ebitda(symbol): 
##    return __request(symbol, 'j4')
##    
##    
##def get_dividend_per_share(symbol):
##    return __request(symbol, 'd')
##
##
##def get_dividend_yield(symbol): 
##    return __request(symbol, 'y')
##    
##    
##def get_earnings_per_share(symbol): 
##    return __request(symbol, 'e')
##
##
##def get_52_week_high(symbol): 
##    return __request(symbol, 'k')
##    
##    
##def get_52_week_low(symbol): 
##    return __request(symbol, 'j')
##
##
##def get_50day_moving_avg(symbol): 
##    return __request(symbol, 'm3')
##    
##    
##def get_200day_moving_avg(symbol): 
##    return __request(symbol, 'm4')
##    
##    
##def get_price_earnings_ratio(symbol): 
##    return __request(symbol, 'r')
##
##
##def get_price_earnings_growth_ratio(symbol): 
##    return __request(symbol, 'r5')
##
##
##def get_price_sales_ratio(symbol): 
##    return __request(symbol, 'p5')
##    
##    
##def get_price_book_ratio(symbol): 
##    return __request(symbol, 'p6')
##       
##       
##def get_short_ratio(symbol): 
##    return __request(symbol, 's7')
##    
    
def get_historical_prices(symbol, start_date, end_date):
    """

    Returns a nested list.
    """
    url = 'http://markets.ft.com/Research//Tearsheets/PriceHistoryPopup?symbol=%s' % symbol
    dataTable = urllib.urlopen(url).read().strip()
    dataTable = dataTable[dataTable.index('<tableContainer>'):dataTable.index('</tableContainer>')]
    dataTable = dataTable.replace('</th><th>',':')
    dataTable = dataTable.replace('</th><th class="text">',':')
    dataTable = dataTable.replace('<th>','')
    dataTable = dataTable.replace('<th class="text">','')
    dataTable = dataTable.replace('</th>','')
    dataTable = dataTable.replace('</td><td>',':')
    dataTable = dataTable.replace('</td><td class="text">',':')
    dataTable = dataTable.replace('<td>','')
    dataTable = dataTable.replace('<td class="text">','')
    dataTable = dataTable.replace('</td>','')
    dataTable = dataTable.replace('</tr><tr>',';')
    dataTable = dataTable.replace('<tr>','')
    dataTable = dataTable.replace('</tr>','')

    header = dataTable[dataTable.index('<thead>'):dataTable.index('</thead>')]
    header = header.replace('<thead>','')
    headings = header.split(':')
    dateIndex = headings.index('Date')
    priceIndex = headings.index('NAV')

    datas = dataTable[dataTable.index('<tbody>'):dataTable.index('</tbody>')]
    datas = datas.replace('<tbody>','')
    datas = datas.split(';')
    returnData = []
    currentYear = datetime.today().year
    currentMonth = datetime.today().month
    for data in datas:
        dataStrip = data.split(':')
        dateStr = dataStrip[dateIndex]
        month = dateStr.split(' ')[0]
        day = dateStr.split(' ')[1]
        if currentMonth == 'January' and month == 'December':
            currentYear -= 1
        date = datetime.date(datetime.strptime(dateStr + ' ' + str(currentYear), '%B %d %Y'))
        if date >= start_date and date <= end_date:
            returnData.append([date, float(dataStrip[priceIndex].replace(',',''))])

    return returnData